/**
 * 应用设置接口定义
 * 包含所有可配置的选项
 */
export interface Settings {
  /** 抖音版本: normal-普通版 | lite-极速版 */
  version: 'normal' | 'lite';
  /** 福袋最小价值(单位:元) */
  minValue: number;
  /** 福袋最大价值(单位:元) */
  maxValue: number;
  /** 提前触发时间(单位:分钟) - 当福袋倒计时剩余多少分钟时开始抢 */
  triggerMinutes: number;
  /** 抢福袋范围: all-所有直播间 | followed-仅关注列表 | fixed-固定直播间 */
  scope: 'all' | 'followed' | 'fixed';
  /** 要抢的福袋奖品类型配置 */
  prizeTypes: {
    phone: boolean;     // 是否抢手机福袋
    other: boolean;     // 是否抢其他类型福袋
  };
}

/**
 * 设置管理类
 * 负责管理应用的所有配置项，包括:
 * 1. UI界面设置的读取和保存
 * 2. 设置的本地存储
 * 3. 设置的应用和更新
 */
class SettingsManager {
  /** 当前设置，包含所有配置项的默认值 */
  private settings: Settings = {
    version: 'normal',    // 默认使用普通版抖音
    minValue: 1200,       // 默认最小价值2000元
    maxValue: 999999,     // 默认最大价值999999元
    triggerMinutes: 2,    // 默认提前2分钟开始抢
    scope: 'all',         // 默认抢所有直播间的福袋
    prizeTypes: {
      phone: true,        // 默认抢手机
      other: false        // 默认不抢其他类型
    }
  };

  /**
   * 从UI界面读取当前设置
   * 将用户在界面上的选择保存到settings对象中
   */
  loadFromUI(): void {
    // 读取抖音版本选择
    this.settings.version = ui.versionSpinner.getSelectedItemPosition() === 0 ? 'normal' : 'lite';
    // 读取福袋价值范围
    this.settings.minValue = parseInt(ui.minValueInput.text()) || 2000;
    this.settings.maxValue = parseInt(ui.maxValueInput.text()) || 999999;
    // 读取触发时间
    this.settings.triggerMinutes = parseInt(ui.triggerMinutes.text()) || 2;
    // 读取抢福袋范围
    if (ui.fixedRadio.isChecked()) {
      this.settings.scope = 'fixed';
    } else if (ui.followedRadio.isChecked()) {
      this.settings.scope = 'followed';
    } else {
      this.settings.scope = 'all';
    }
    
    // 读取奖品类型选择
    this.settings.prizeTypes = {
      phone: ui.phoneCheck.isChecked(),      // 是否选中抢手机
      other: ui.otherCheck.isChecked()       // 是否选中抢其他
    };

    // 立即保存设置
    this.save();
  }

  /**
   * 保存设置到本地存储
   * 使用storages API将设置持久化保存
   */
  save(): void {
    try {
      storages.create('douyin_fudai').put('settings', this.settings);
    } catch (e) {
      console.error('保存设置失败:', e);
    }
  }

  /**
   * 从本地存储加载设置
   * 读取之前保存的设置并应用到UI界面
   */
  load(): void {
    try {
      const stored = storages.create('douyin_fudai').get('settings');
      if (stored) {
        this.settings = stored;
        this.applyToUI();
      }
    } catch (e) {
      console.error('加载设置失败:', e);
    }
  }

  /**
   * 将当前设置应用到UI界面
   * 根据settings对象的值更新UI界面上的各个控件状态
   */
  applyToUI(): void {
    // 设置抖音版本
    ui.versionSpinner.setSelection(this.settings.version === 'normal' ? 0 : 1);
    // 设置福袋价值范围
    ui.minValueInput.setText(this.settings.minValue.toString());
    ui.maxValueInput.setText(this.settings.maxValue.toString());
    // 设置触发时间
    ui.triggerMinutes.setText(this.settings.triggerMinutes.toString());

    // 设置抢福袋范围
    if (this.settings.scope === 'fixed') {
      ui.fixedRadio.setChecked(true);
    } else if (this.settings.scope === 'followed') {
      ui.followedRadio.setChecked(true);
    } else {
      ui.allRadio.setChecked(true);
    }

    // 设置奖品类型选择
    ui.phoneCheck.setChecked(this.settings.prizeTypes.phone);
    ui.otherCheck.setChecked(this.settings.prizeTypes.other);
  }

  /**
   * 获取当前设置的副本
   * @returns 当前设置的深拷贝
   */
  getSettings(): Settings {
    return { ...this.settings };
  }

  /**
   * 更新设置
   * @param newSettings 要更新的设置项
   */
  updateSettings(newSettings: Partial<Settings>): void {
    this.settings = { ...this.settings, ...newSettings };
    this.save();
    this.applyToUI();
  }

  /**
   * 检查指定的奖品类型是否允许抢
   * @param type 奖品类型名称
   * @returns 是否允许抢这个类型的奖品
   */
  isPrizeTypeAllowed(type: string): boolean {
    switch (type.toLowerCase()) {
      case '手机':
        return this.settings.prizeTypes.phone;
      default:
        return this.settings.prizeTypes.other;
    }
  }
}

// 导出SettingsManager的单例实例
export default new SettingsManager();
